package csel.model;

import java.util.ArrayList;
import java.util.List;

public class Inventory implements java.io.Serializable
{
	private static final long serialVersionUID = 1L;
	protected ArrayList<EquippableItem> equippableItems = new ArrayList<EquippableItem>();
	protected ArrayList<UseableItem> useableItems = new ArrayList<UseableItem>();

	boolean hasChanged;

	public Inventory()
	{
		hasChanged = true;
	}

	public Inventory(ArrayList<UseableItem> useableItem,
			ArrayList<EquippableItem> equippableItem)
	{
		hasChanged = false;
		this.useableItems = useableItem;
		this.equippableItems = equippableItem;
	}

	public boolean addEquippableItem(EquippableItem e)
	{
		hasChanged = true;
		equippableItems.add(e);
		return (true);
	}

	public boolean addUseableItem(UseableItem u)
	{
		hasChanged = true;
		useableItems.add(u);
		return (true);
	}

	public EquippableItem dropEquippableItem(EquippableItem e)
	{
		Tile potentialDropSite = e.getCarriedBy().getLocation();
		if(potentialDropSite.getItem()==null)
		{
			if (equippableItems.remove(e))
			{
				potentialDropSite.setItem(e);
				e.setLocation(potentialDropSite);
				hasChanged = true;
				e.getCarriedBy().notifyO();
				e.setCarriedBy(null);
				return (e);
			}
		}
		return null;
	}

	public UseableItem dropUseableItem(UseableItem u)
	{	
		System.out.println("[MODEL] item is carried " +u.getLocation());
		{
			if(Model.infoMode)System.out.println("[MODEL] item is carried " +u.getLocation());
			Tile potentialDropSite = u.getCarriedBy().getLocation();
			if(potentialDropSite.getItem()==null)
			{
				if (useableItems.remove(u))
				{
					potentialDropSite.setItem(u);
					u.setLocation(potentialDropSite);
					hasChanged = true;
					u.getCarriedBy().notifyO();
					u.setCarriedBy(null);
					return (u);
				}
			}
			return null;
		}
	}

	public List<UseableItem> getUseableItems()
	{
		return useableItems;
	}

	public List<EquippableItem> getEquippableItems()
	{
		return equippableItems;
	}
	public void removeItem(TakeableItem i)
	{
		hasChanged = true;
		if(!equippableItems.remove(i))
		{
			useableItems.remove(i);
		}
	}
	public boolean hasItem(TakeableItem i)
	{
		if(!equippableItems.contains(i))
		{
			return(useableItems.contains(i));
		}
		else
		{
			return(true);
		}
	}
	public boolean hasChanged()
	{
		return(hasChanged);
	}
	public void clearHasChanged()
	{
		hasChanged = false;
	}
	public void setHasChanged(boolean val)
	{
		hasChanged = val;
	}
}
